/*
 * This is written by Lulu Han.
 * E-mail: locomotive_crypto@163.com
 */
#include "sec_suez.h"

SecUez::CloudA::CloudA(const PrivateKey& pri): m_setA(pri){
	// ...
}

void SecUez::CloudA::set_vlen(long vlens){
	m_setA.set_vlen(vlens);
}

void SecUez::CloudA::dec_reenc(const NTL::ZZ& nca, const NTL::ZZ& ncb, NTL::ZZ& cmul){
	m_setA.dec_reenc(nca, ncb, cmul);
}

void SecUez::CloudA::dec_gen_beta(const NTL::ZZ& ct, NTL::ZZ& cbeta){
	m_setA.dec_gen_beta(ct, cbeta);
}

////////////////////////////////////////////////////////////////////////

SecUez::CloudB::CloudB(const PublicKey& pub): m_enc(pub), m_setB(pub){
	// ...
}

void SecUez::CloudB::set_vlen(long vlens){
	m_setB.set_vlen(vlens);
}

void SecUez::CloudB::calc_sub(const NTL::ZZ& cx){
	NTL::ZZ z(0), cz;
	m_enc.Encrypt(z, cz);
	
	m_setB.calc_sub(cx, cz);
}

void SecUez::CloudB::gen_two_ciphers(NTL::ZZ& nca, NTL::ZZ& ncb){
	m_setB.gen_two_ciphers(nca, ncb);
}

void SecUez::CloudB::calc_expr(const NTL::ZZ& cmul, NTL::ZZ& ct){
	m_setB.calc_expr(cmul, ct);
}

void SecUez::CloudB::gen_res(const NTL::ZZ& cbeta, NTL::ZZ& res){
	m_setB.gen_res(cbeta, res);
	
	NTL::ZZ one(1), cone;
	m_enc.Encrypt(one, cone);
	m_enc.HE_Mul_Const(res, m_enc.GetN() - 1, res);
	m_enc.HE_Add_Cipher(cone, res, res);
}

		
